#include "head.h"

int pipe_fd[2];

void func(int num){
    write(pipe_fd[1], "1", 1);
    return;
}

int main(int argc, char *argv[])
{
    pipe(pipe_fd);

    if(fork() != 0){
        // 父进程逻辑
        // 监听信号
        signal(2, func);
        wait(NULL);

        close(pipe_fd[0]);
        close(pipe_fd[1]);
        exit(0);
    }

    setpgid(0, 0);

    status_t status;
    // 初始化status结构体, 并启动线程
    initStatus(&status, PTHREAD_COUNT);

    // 创建socket
    int socket_fd;
    initSocket(&socket_fd, "192.168.244.135", "8080");

    // 创建epoll对象
    int epoll_fd = epoll_create(1);
    ERROR_CHECK(epoll_fd, -1, "epoll_create");
    // 把socket_fd放到epoll中监听
    addEpoll(epoll_fd, socket_fd);
    
    addEpoll(epoll_fd, pipe_fd[0]);
    while(1){
        // 创建监听数组
        struct epoll_event list[10];
        int epoll_num = epoll_wait(epoll_fd, list, 10, -1);

        for(int i=0; i<epoll_num; i++){
            int fd = list[i].data.fd;
            
            if(fd == socket_fd){
                // 建立连接,添加到就绪队列                
                int net_fd = accept(socket_fd, NULL, NULL);
                pthread_mutex_lock(&status.lock);
                enQueue(&status.queue, net_fd);
                pthread_cond_signal(&status.cond);
                pthread_mutex_unlock(&status.lock);
            }
            if(fd == pipe_fd[0]){
                // 给子线程发退出消息
                char buf[60] = {0};
                read(pipe_fd[0], buf, sizeof(buf));
    
                // 修改标志位
                pthread_mutex_lock(&status.lock);
                status.exitFlag = 1;
                pthread_cond_broadcast(&status.cond);
                pthread_mutex_unlock(&status.lock);

                printf("exitflag = %d\n", status.exitFlag);
                for(int k=0; k<status.num; k++){
                    pthread_join(status.thread_ids[k], NULL);
                    printf("子线程%d 退出了\n",k);
                }

                pthread_exit(NULL);
            }
        }
    }
    return 0;
}
